package bank

import "sync"

var (
	balance int
	mu      sync.RWMutex
)

func Init() {
	balance = 100
}

func Add(amount int) { //这边加速会和Withdraw造成重入锁
	// mu.Lock()
	// defer mu.Unlock()
	balance += amount
	return
}

//TODO 互斥锁和读写锁有什么区别？
/**
第一Balance不会在其它操作比如Withdraw“中间”执行。
第二（更重要的）是“同步”不仅仅是一堆goroutine执行顺序的问题，同样也会涉及到内存的问题。处理器缓存同步到内存
*/
func Balance() int {
	mu.Lock()
	defer mu.Unlock()
	return balance
}

func Withdraw(amount int) bool {
	mu.Lock()
	defer mu.Unlock()
	Add(-amount)
	if balance < 0 {
		Add(amount)
		return false
	}
	return true
}
